#include <stdio.h>
#include "pthread.h"
#include "semaphore.h"
#include <unistd.h>
#include <math.h>
/* linux 多线程同步-----信号量 */
/* 
   信号量 头文件 #include "semaphore.h"
   信号量变量类型 sem_t 
   信号量初始化
        sem_init(sem_t *sem,int pshared,unsigned int value)
            sem 信号量变量。
            pshared 
                pshared = 0 用于同一进程之间多线程的同步。
                pshare > 0  用于相关多进程之间的同步。例如使用 fork创建的进程
            value 信号量计数值的初始值
    信号量的销毁
        sem_destroy(sem_t *sem)
            sem 信号量变量
    当前信号量计数值的获取
        sem_getvalue(sem_t *sem,int *sval)
            sem 信号量变量
            sval 获取的计数值保存在此变量中
    信号量的释放 
        sem_post(sem_t *sem) 
            释放资源，信号量+1 V操作
    获取信号量
        阻塞
            sem_wait(sem_t *sem)
        非阻塞
            sem_trywait(sem_t *sem)
        申请资源。信号量 -1 。P操作    
*/

/* 定义信号量 相关变量 */
sem_t sem_f;
/* 生产者任务 */
void *Task_Producer(void *data)
{
    pthread_detach(pthread_self()); //分离线程 子线线程结束时自动回收资源
    while (1)
    {
        sem_post(&sem_f);
       // printf("sem_post runningn\n");
        sleep(2);
    }
    pthread_exit(NULL);
}
/* 消费者任务 */
void *Task_Consumer(void *data)
{
    pthread_detach(pthread_self()); //分离线程 子线线程结束时自动回收资源
    while (1)
    {
        sem_wait(&sem_f);
        printf("sem_wait running\n");
    }   
    pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
    /* code */
    int sem_ret = 0;
    /* 初始化信号量 */
    sem_ret = sem_init(&sem_f, 0, 0);
    if (sem_ret == -1)
        perror("sem_init\n");
    /* 创建线程 */
    pthread_t producer_tid, consumer_tid;
    int pthread_ret = 0;
    pthread_ret = pthread_create(&producer_tid, NULL, Task_Producer, NULL);
    if (pthread_ret == -1)
        perror("pthread_create\n");
    pthread_ret = pthread_create(&consumer_tid, NULL, Task_Consumer, NULL);
    if (pthread_ret == -1)
        perror("pthread_create\n");
    sleep(1);
    pthread_exit(NULL);
    return 0;
}
